package es.masterd.ejer08_1;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;


public class MainActivity extends MapActivity {
	private MapView mapa;
	private MapController mapController;
	private List<Overlay> mapOverlays;
	private MiItemizedOverlay itemizedoverlay;
	private EditText direccion;

	/** Called when the activity is first created. */
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// Configure the map
		mapa = (MapView) findViewById(R.id.mapa);
		
		mapa.displayZoomControls(true);
		mapa.setBuiltInZoomControls(true);
		
		mapController = mapa.getController();
		mapController.setZoom(14); // Zoom x14
		
		Button buscar = (Button) findViewById( R.id.buscar);
		buscar.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				buscar();
			}});

		direccion = (EditText) findViewById(R.id.direccion);	
	}
	
	/**
	 * Partiendo de un texto busca direcciones geogr�ficas que coincidan con esa direcci�n
	 */
	protected void buscar() {
		Geocoder geo = new Geocoder(MainActivity.this);
		List<Address> resultados;
		
		itemizedoverlay = new MiItemizedOverlay(this, getResources().getDrawable(R.drawable.icon));
		try {
			resultados = geo.getFromLocationName(""+direccion.getText(),10);
			
			for(Address direccion: resultados) {
				itemizedoverlay.addLocalizacion(direccion);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// Finalmente limpiamos el mapa y volvemos a dibujar con los resultados
			mapOverlays = mapa.getOverlays();
			mapOverlays.clear();
			mapOverlays.add(itemizedoverlay);
			
			animarMapa();
		}

	}

	protected void animarMapa() {
		super.onStart();
		
		// Animamos el mapa de punto a punto
		int n = itemizedoverlay.size();
		
		for (int x = 0; x < n; x++) {
			OverlayItem hito = itemizedoverlay.getItem(x);
			mapController.animateTo(hito.getPoint());

			Toast.makeText(this, hito.getTitle() + "\n" + hito.getPoint(), Toast.LENGTH_LONG).show();
		}
	}


	
	protected boolean isRouteDisplayed() {
		return false;
	}


	/**
	 * Clase para representar puntos en el mapa
	 * 
	 * Recibir� las direcciones que encuentre
	 * 
	 */
	class MiItemizedOverlay extends ItemizedOverlay<OverlayItem> {
		private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
		private Context context;

		public MiItemizedOverlay(Context context, Drawable defaultMarker) {
			super(boundCenterBottom(defaultMarker));
			this.context = context;
		}

		public void addLocalizacion(Address direccion) {
			GeoPoint punto = new GeoPoint((int) (direccion.getLatitude() * 1E6), (int) (direccion.getLongitude() * 1E6));

			OverlayItem item = new OverlayItem(punto, direccion.getAddressLine(0), null);
			
			mOverlays.add(item);
			populate();
		}

		public void clear() {
			mOverlays.clear();
			populate();
		}

		
		protected OverlayItem createItem(int i) {
			return mOverlays.get(i);
		}

		
		public int size() {
			return mOverlays.size();
		}

		
		protected boolean onTap(int index) {
			String etiqueta = mOverlays.get(index).getTitle();
			Toast.makeText(context, etiqueta, Toast.LENGTH_LONG).show();
			return false;
		}

		
	}
	
}